#include "pg.h"

Pg::Pg(QSqlDatabase sqlDb)
{
    db = sqlDb;
    fams = 0;
    proms = 0;
    centre = "";
    id = 0;
    solde = 0.0;
    statut = STANDARD;
}

Pg::Pg( int i, bool admin, QSqlDatabase sqlDb)
{
    db = sqlDb;
    fams = 0;
    proms = 0;
    centre = "";
    id = i;
    solde = 0.0;
    statut = STANDARD;

    completer(admin);
}

Pg::Pg( int fam, QString prom, bool admin, QSqlDatabase sqlDb)
{
    statut = STANDARD;
    fams = fam;
    setProms(prom);
    //on initialise l'Id pour vérifier si le pg existe
    id = 0;
    solde = 0.0;

    db = sqlDb;
    completer(admin);
}


Pg::~Pg(){

}


void Pg::setProms(QString p){


    if(p.length() > 6){
        QStringList pp = p.split(" : ");
        if(pp.count()){
            statut = ETRANGER;
            p = pp.at(0);
        }
    }


    // la proms complète est de la forme 'An 212', donc on coupe la chaine au niveau du caractère espace, que l'on stocke dans une liste
    if(p.length() == 6 && p.contains(' ')){
        QStringList l = p.split(' ');
        centre = l.at(0); // on copie la première chaine dans centre
        proms = l.at(1).toInt(); // la deuxième dans proms après l'avoir transformée en nombre
    }else{
        // Si la forme n'est pas bonne, on initialise les variables
        centre = "";
        proms = 0;
    }
}

int Pg::getFams(){
    return fams;
}

int Pg::getId(){
    return id;
}

double Pg::getSolde(){
    return solde;
}

QString Pg::getProms(){
    QString s = statut == ETRANGER ? " : Perpet'ss" : "" ;
    return centre + " " + QVariant(proms).toString() + s;
}

QString Pg::getBucque(){
    return bucque;
}

bool Pg::isActif(){
    return actif;
}

Pg::Statut Pg::getStatus(){
    return statut;
}

bool Pg::completer(bool admin){

    //Si la fam's et la prom's sont de la bonne forme, on recherche le Pg

    if(fams > 0 and proms > 0 and centre.length() == 2){
        db.transaction();
        QSqlQuery q;    // On créer la requète de recherche des informations manquantes.
        if(statut == ETRANGER){
            q.prepare("SELECT `Id`, `Bucque`, `Solde`, `Actif`, `Statut` FROM `Pg` WHERE `Fams` = :Fams AND `Proms` = :Proms AND `Centre` = :Centre AND `Statut` = 1");

        }else{
            q.prepare("SELECT `Id`, `Bucque`, `Solde`, `Actif`, `Statut` FROM `Pg` WHERE `Fams` = :Fams AND `Proms` = :Proms AND `Centre` = :Centre AND `Statut` <> 1");

        }
        q.bindValue(":Fams",fams);
        q.bindValue(":Proms",proms);
        q.bindValue(":Centre",centre);
        q.exec();

        if(q.first()){

            // Si on a un premier resultat, on complète les variables
            id = q.value(0).toInt();
            bucque = q.value(1).toString();
            solde = q.value(2).toDouble();
            actif = q.value(3).toBool();
            statut = toStatut(q.value(4).toInt());
            if(!actif && !admin){
                id = -1;
                //Si le pg n'est pas actif et que nous ne sommes pas en mode admin, l'Id n'est pas spécifié pour que les modifications ne soient pas accessibles.
            }
        }else{
            id = -1;

        }
        q.finish();
        db.commit();

    }else if(id > 0){
        db.transaction();
        QSqlQuery q;    // On créer la requète de recherche des informations manquantes.
        q.prepare("SELECT * FROM `Pg` WHERE `Id` = :id");
        q.bindValue(":id",id);
        q.exec();

        if(q.first()){
            // Si on a un premier resultat, on complète les variables
            fams = q.value(1).toInt();
            centre = q.value(2).toString();
            proms = q.value(3).toInt();
            bucque = q.value(4).toString();
            solde = q.value(7).toDouble();
            actif = q.value(5).toBool();
            statut = toStatut(q.value(6).toInt());
            if(!actif && !admin){
                id = -1;
                //Si le pg n'est pas actif et que nous ne sommes pas en mode admin, l'Id n'est pas spécifié pour que les modifications ne soient pas accessibles.
            }
        }else{
            id = -1;
        }
        q.finish();
        db.commit();
    }
    if(id == -1){
        return false;
    }
    return true;
}



Pg::Statut Pg::toStatut(int st)
{
    switch(st){
    case 0:
        return Pg::STANDARD;
        break;

    case 1:
        return Pg::ETRANGER;
        break;

    case 2:
        return Pg::ZIDENT;
        break;

    default:
        return Pg::STANDARD;
    }
}

bool Pg::etranger(QString *proms){
    bool etranger = false;
    if(proms->size() > 6){
        if(proms->split(" : ").at(1) == "Perpet'ss"){
            etranger = true;
        }
        *proms = proms->split(" : ").at(0);
    }
    return etranger;
}

QStringList Pg::listProms(int fams, bool inactif){
    QStringList l;
    QString requete = "";
    if(inactif){
        requete = "SELECT CONCAT(`Centre`,\" \" , `Proms`) AS prom , Proms, Statut FROM `Pg` WHERE `Fams` = :Fams ORDER BY Proms DESC, prom";
    }else{
        requete = "SELECT CONCAT(`Centre`,\" \" , `Proms`) AS prom , Proms, Statut FROM `Pg` WHERE `Fams` = :Fams AND `Actif` = 1 ORDER BY Proms DESC, prom";
    }

    QSqlDatabase db = QSqlDatabase::database();
    db.transaction();
    QSqlQuery q;
    //On prépare une requete pour récuperer les prom's dans lesquelles la fam's demandée est associée à un compte actif
    q.prepare(requete);
    q.bindValue(":Fams",fams);
    q.exec();
    //On insère les prom's dans la liste
    while(q.next()){
        QString s = q.value(0).toString();
        if(Pg::toStatut(q.value(2).toInt()) == Pg::ETRANGER){
            s += " : Perpet'ss";
        }
        l.append(s);

    }
    //On termine la requète
    q.finish();
    db.commit();

    return l;
}

Pg Pg::creer(int fams, QString prom, QString Bucque, Statut s){

    QSqlDatabase db = QSqlDatabase::database();

    Pg pg(db);
    pg.setProms(prom);

    if(fams > 0){
        db.transaction();
        QSqlQuery q;
        q.prepare("INSERT INTO Pg (Fams,Centre,Proms,Bucque,Actif,Statut,Solde) VALUES (:f,:c,:p,:b,1,:s,0.0)");
        q.bindValue(":f",fams);
        q.bindValue(":c",pg.centre);
        q.bindValue(":p",pg.proms);
        q.bindValue(":b",Bucque);
        q.bindValue(":s",int(s));
        bool ok = q.exec();
        db.commit();

        Pg nouveau(q.lastInsertId().toInt());
        return nouveau;
    }
    return Pg(db);

}
